package io.dy.config;

import io.dy.utils.ThreadUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.*;

/**
 * @author dmj
 * @date 2024年04月18日 上午11:38
 * 线程池配置类
 */
@Configuration
public class ThreadPoolConfig {

    /**
     * sku线程池
     * @return
     */
    @Bean
    public ThreadPoolExecutor skuThreadPoolExecutor(){
        return new ThreadPoolExecutor(
                //核心线程数
                2,
                //最大线程数
                Runtime.getRuntime().availableProcessors() * 2,
                //存活时间
                10,
                //存活时间单位
                TimeUnit.SECONDS,
                //等待队列
                new ArrayBlockingQueue<>(100),
                //线程工厂
                (r)->{
                    Thread thread = new Thread(r);
                    thread.setName("sku_custom_thread_" + thread.getId());
                    return thread;
                },
                //拒绝策略
                new ThreadPoolExecutor.DiscardPolicy()){
            @Override
            protected void afterExecute(Runnable r, Throwable t) {
                //处理异常
                if (t != null) {
                    //表示execute提交方式抛出的异常
                    ThreadUtils.printThreadLog("afterExecute里面获取到execute提交的异常信息，处理异常信息:" + t.getMessage());
                    //可以记录异常信息。。。
                }

                //判断 r 是否是 FutureTask 类型； 若是 表示submit方式提交
                if(r instanceof FutureTask){
                    try {
                        Future<?> future = (Future<?>) r;
                        //submit提交异常信息 必须通过get获取结果的时候才会抛出
                        future.get();
                    } catch (Exception e) {
                        ThreadUtils.printThreadLog("afterExecute里面获取到execute提交的异常信息，处理异常信息:" + e);
                        //可以记录异常信息。。。
                    }
                }
            }
        };
    }

    /**
     * 商品线程池
     * @return
     */
    @Bean
    public ThreadPoolExecutor itemThreadPoolExecutor(){
        return new ThreadPoolExecutor(
                //核心线程数
                3,
                //最大线程数
                Runtime.getRuntime().availableProcessors() * 2,
                //存活时间
                10,
                //存活时间单位
                TimeUnit.SECONDS,
                //等待队列
                new ArrayBlockingQueue<>(200),
                //线程工厂
                (r)->{
                    Thread thread = new Thread(r);
                    thread.setName("item_custom_thread_" + thread.getId());
                    return thread;
                },
                //拒绝策略
                new ThreadPoolExecutor.DiscardPolicy());
    }

    /**
     * 订单线程池
     * @return
     */
    @Bean
    public ThreadPoolExecutor orderThreadPoolExecutor(){
        return new ThreadPoolExecutor(
                //核心线程数
                4,
                //最大线程数
                Runtime.getRuntime().availableProcessors() * 3,
                //存活时间
                10,
                //存活时间单位
                TimeUnit.SECONDS,
                //等待队列
                new ArrayBlockingQueue<>(300),
                //线程工厂
                (r)->{
                    Thread thread = new Thread(r);
                    thread.setName("order_custom_thread_" + thread.getId());
                    return thread;
                },
                //拒绝策略
                new ThreadPoolExecutor.DiscardPolicy());
    }

    /**
     * 报表线程池
     * @return
     */
    @Bean
    public ThreadPoolExecutor reportThreadPoolExecutor(){
        return new ThreadPoolExecutor(
                //核心线程数
                5,
                //最大线程数
                Runtime.getRuntime().availableProcessors() * 4,
                //存活时间
                10,
                //存活时间单位
                TimeUnit.SECONDS,
                //等待队列
                new ArrayBlockingQueue<>(400),
                //线程工厂
                (r)->{
                    Thread thread = new Thread(r);
                    thread.setName("report_custom_thread_" + thread.getId());
                    return thread;
                },
                //拒绝策略
                new ThreadPoolExecutor.DiscardPolicy());
    }
}
